package com.xjh.basestudy.javabase.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class huoqugouzaofangfa1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取Class对象
        //1.首先通过Class类的forName方法，获取一个类的class字节码文件对象c
        Class<?> c = Class.forName("heimaliuyi.reflect.Student");
        //获取公共的构造方法，并且以数组形式存储。
        Constructor<?>[] cons =  c.getConstructors();
        //数组内容:
        //public heimaliuyi.reflect.Student(java.lang.String,int,java.lang.String)//Student里的带参构造
        //public heimaliuyi.reflect.Student()//Student里的无参构造
        //获取所有构造方法,并且以数组形式存储。
//        Constructor<?>[] cons = c3p0pool.getDeclaredConstructors();
       //采用增强for输出数组里的内容
        for(Constructor con : cons){
            System.out.println(con);
        }
        System.out.println("----------------------------------------");
        //以下能内容是获取一个指定的构造方法的步骤
        //返回一个Constructor对象，该对象反映由该Class对象表示的类的指定公共构造方法。
        //需要参数（构造方法的参数个数，class文件对象），否则不知道你指定的是哪个公共构造方法
        //2.然后通过c（class类型的对象）的getConstructor方法获取单个构造方法对象con
        Constructor<?> con = c.getConstructor();
        //Constructor类提供了一个类的单个的构造函数的信息和访问权限
        //3.通过构造方法对象con里的newInstance方法创建一个Object类型的对象
        Object obj = con.newInstance();
        System.out.println(obj);
        //输出Student{name='null',age =0,aderess='null'}，因为学生类中重写了通String方法
        //一般的创建对象的方式
//        Student s = new Student();
//        System.out.println(s);

    }
}
//通过反射获取单个指定构造方法总结：
//1.首先通过Class类的forName方法，获取一个类的class字节码文件对象c
//2.然后通过c（class类型的对象）的getConstructor方法获取单个构造方法对象con
//3.通过构造方法对象con里的newInstance方法创建一个Object类型的对象
